package config

import (
	"time"

	"gitee.com/xiaoyutab/xgotool/https"
	"gitee.com/xiaoyutab/xgotool/optional/xcache"
	"gitee.com/xiaoyutab/xgotool/optional/xcron"
	"gitee.com/xiaoyutab/xgotool/optional/xlog"
	"gitee.com/xiaoyutab/xgotool/optional/xnsq"
	"gitee.com/xiaoyutab/xgotool/xconsole"
	"gitee.com/xiaoyutab/xgotool/xgodb"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB

// 主体注册配置
func Regedit() {
	if DB == nil {
		db, err := gorm.Open(mysql.Open(GetConfig().MySQL), &gorm.Config{})
		if err != nil {
			panic("初始数据库连接失败：" + err.Error())
		}
		DB = db
	}
	// 命令行注册
	xconsole.Regedit(&xconsole.Config{
		Version: "v1.0.0",
	})
	// 基础项配置
	xgodb.Regedit(&xgodb.Config{
		DB: DB,
	})
	configure()        // 配置项初始化
	configure_listen() // 配置项监听
	nsq_listen("")
	// 日志配置
	xlog.Regedit(&xlog.Config{
		DB: DB,
	})
	// HTTPS请求配置
	https.Regedit(&https.Config{
		LogsFunc: xlog.Quest,
	})
	// 定时任务配置[定时任务需要使用go携程进行运行]
	go xcron.Regedit(&xcron.Config{})
	defer xcron.Restart()
	crontabs()
	// 数据表同步到数据库中去
	go init_db()
	// 缓存配置
	xcache_listen("")
}

// 缓存配置
//
//	name	配置项名称【兼容xgodb配置项变更函数】
func xcache_listen(name string) {
	if xgodb.GetBool("REDIS_STSTUS") {
		xcache.Regedit(&xcache.Config{
			Hosts:       xgodb.GetString("REDIS_HOST"),
			Pass:        xgodb.GetString("REDIS_PASS"),
			RedisSelect: uint8(xgodb.GetInt("REDIS_NUM")),
			ErrFunc:     xlog.Error,
		})
	} else {
		xcache.RemoveRegedit() // 移除缓存配置
	}
}

// nsq队列监听配置
//
//	name	配置项名称【兼容xgodb配置项变更函数】
func nsq_listen(name string) {
	if xgodb.GetBool("NSQ_STATUS") {
		// 队列配置
		xnsq.Regedit(&xnsq.Config{
			Set:            xgodb.GetString("NSQ_SET"),
			SetTopic:       xgodb.GetString("NSQ_SET_TOPIC"),
			Get:            xgodb.GetString("NSQ_GET"),
			GetTopic:       xgodb.GetString("NSQ_GET_TOPIC"),
			GetChannel:     xgodb.GetString("NSQ_GET_CHANNEL"),
			GetMaxInFlight: int(xgodb.GetInt("NSQ_GET_MAX_IN_FLIGHT")),
			MaxAttempts:    uint16(xgodb.GetInt("NSQ_GET_MAX_ATTEMPTS")),
		})
		// 重启NXSQ队列
		go func() {
			xnsq.Stop()
			time.Sleep(time.Second * 5)
			xnsq.Start(xgodb.GetString("NSQ_GET"), xgodb.GetString("NSQ_SET"))
		}()
	} else {
		xnsq.RemoveRegedit()
		// 停止XNSQ队列
		xnsq.Stop()
	}
}
